package src.javaStudy.inherit;

/**
 * @program: AlgorithmTest
 * @description: 向上转型的好处
 *
 * 1、把子类对象直接赋给父类引用叫upcasting向上转型，向上转型不用强制转型。
 * 　　 如Father father = new Son();
 *
 * 2、把指向子类对象的父类引用赋给子类引用叫向下转型（downcasting），要强制转型,要向下转型，必须先向上转型为了安全可以用instanceof判断。
 * 　　 如father就是一个指向子类对象的父类引用，把father赋给子类引用son 即Son son =（Son）father；
 * 　　 其中father前面的（Son）必须添加，进行强制转换。
 *
 * 3、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法，子类方法有效，向上转型只能引用父类对象的属性，要引用子类对象属性，则要写getter函数。
 *
 * 4、向上转型的作用，减少重复代码，父类为参数，调有时用子类作为参数，就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
 *
 * @author: powerWriter
 * @create: 2019-06-16 12:51
 **/

public class Human {
    public void sleep() {
        System.out.println("Human sleep..");
    }

    public void run(){
        System.out.println("Human run..");
    }
    public static  void doSleep(Human h){
        h.sleep();

    }//此时传递的参数是父类对象，但是实际调用时传递子类对象，就是向上转型。
    public static void main(String[] args) {
        Human h = new Male1();// 向上转型
        // 此处匿名子类对象，当然实际应用时应该是用上面的向上转型公式，然后将子类对象传递进来，
        // 这样以后好在向下转型，此处没有向下转型，所以直接用了匿名类对象。
        doSleep(new Male1());
        doSleep(new Female1());
        //doSleep(new man());
    }
}

class Male1 extends Human {
    @Override
    public void sleep() {
        System.out.println("Male sleep..");
    }
    @Override
    public void run(){

    }
}

class Female1 extends Human {
    @Override
    public void sleep() {
        System.out.println("Female sleep..");
    }

}

class man {
    public void sleep() {
        System.out.println("man sleep..");
    }
}
